package bean;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;

/**
 * Comprime um arquivo seguindo o algoritmo LZW
 * 
 * @author Anderson Almeida
 * @author Giovani Barbosa
 * 
 */
public class Compressao extends LZW {
	/**
	 * Comprime um arquivo qualquer, dados seu diretorio e o diretorio destino
	 * para o arquivo compactado.
	 * 
	 * @param fileEntrada
	 *            O diretorio do arquivo
	 * @param fileSaida
	 *            O diretorio o qual o arquivo compactado ficara
	 * @throws IOException
	 *             Caso o arquivo nao seja encontrado
	 */
	public void comprime(String fileEntrada, String fileSaida)
			throws IOException {
		int codigo = 0;
		char carac = 0;
		String frase = "";
		final String FORMATO = ".lzw";
		FileOutputStream file = new FileOutputStream(fileSaida + FORMATO);
		ObjectOutputStream saida = new ObjectOutputStream(file);

		InputStreamReader entrada = new InputStreamReader(new FileInputStream(
				fileEntrada));

		while (entrada.ready()) {
			carac = (char) entrada.read();
			if (dicionario.getIndex(frase + carac) != -1) {
				frase = frase + carac;
			} else {
				codigo = dicionario.getIndex(frase);
				dicionario.add((frase + carac));
				frase = carac + "";
				saida.writeInt(codigo);

			}

		}
		if (!frase.equals("")) {
			saida.writeInt(dicionario.getIndex(frase));

		}

		saida.flush();
		saida.close();
		file.flush();
		file.close();

	}

}
